#include "groupmodel.h"
#include "db.h"

// 创建群组
bool GroupModel::createGroup(Group &group)
{
    // 1.组装sql语句
    char sql[1024] = {0};
    sprintf(sql, "insert into allgroup(groupname,groupdesc) values('%s','%s')",
            group.getName().c_str(), group.getDesc().c_str());

    MySQL mysql;
    if (mysql.connect())
    {
        if (mysql.update(sql))
        {
            group.setId(mysql_insert_id(mysql.getConnection()));
            return true;
        }
    }

    return false;
}

// 加入群组
void GroupModel::addGroup(int userid, int groupid, string role)
{
    // 1.组装sql语句
    char sql[1024] = {0};
    sprintf(sql, "insert into groupuser values(%d,%d,'%s)", groupid, userid, role.c_str());

    MySQL mysql;
    if (mysql.connect())
    {
        mysql.update(sql);
    }
}

// 查询该用户所在的群组的详细信息  （用户可能在多个群中)
vector<Group> GroupModel::queryGroups(int userid)
{
    /*
    用户可能在多个群中
    1.先根据userid在groupuser表中查询出该用户所属的全部群组信息
    2.在根据群组信息，查询该群组的所有用户id,并且和user表进行联合查询，查询出用户的详细信息（id,name,state)
    */

    // 1.组装sql语句
    char sql[1024] = {0};
    sprintf(sql, "select allgroup.id,allgroup.groupname,allgroup.groupdesc  \
                 from allgroup inner join groupuser on allgroup.id = groupuser.groupid  \
                 where groupuser.userid = %d",
            userid);

    vector<Group> groupVec;

    MySQL mysql;
    if (mysql.connect())
    {
        MYSQL_RES *res = mysql.query(sql);
        if (res != nullptr)
        {
            // 查出userid所有的群组信息
            MYSQL_ROW row;
            while ((row = mysql_fetch_row(res)) != nullptr)
            {
                Group group;
                group.setId(atoi(row[0]));
                group.setName(row[1]);
                group.setDesc(row[2]);

                groupVec.push_back(group);
            }
            mysql_free_result(res);
        }
    }


    // 下面这一步是为了提高查询效率，减少数据库的负载。
    // 查询每个群中的所有用户的详细信息，目的是为了给group中_user中添加值
    // 其中_user代表的是该群中的所有用户成员
    for (auto &group : groupVec)
    {
        char sql1[1024] = {0};
        sprintf(sql1, "slect user.id,user.name,user.state,groupuser.grouprole  \
                      from user inner join groupuser on user.id=groupuser.userid \
                      where groupuser.groupid = %d", group.getId());
        
        MySQL mysql;
        if(mysql.connect())
        {
            MYSQL_RES* res = mysql.query(sql);
            if(res!=nullptr)
            {
                MYSQL_ROW  row;
                while ((row = mysql_fetch_row(res)) != nullptr)
                {
                    GroupUser user;
                    user.setId(atoi(row[0]));
                    user.setName(row[1]);
                    user.setState(row[2]);
                    user.setRole(row[3]);

                    group.getUsers().push_back(user);
                }

                mysql_free_result(res);
            }
        }
    }

    return groupVec;
}

// 根据指定的groupid查询该群组的用户id列表，除了userid自己，主要用于用户群聊业务给组内其他成员群发消息
vector<int> GroupModel::queryGroupUsers(int userid, int groupid)
{
    // 1.组装sql语句
    char sql[1024] = {0};
    sprintf(sql, "select userid from groupuser where groupid = %d and userid != %d", groupid, userid);

    vector<int> vec;
    MySQL mysql;
    if (mysql.connect())
    {
        MYSQL_RES *res = mysql.query(sql);
        if (res != nullptr)
        {
            MYSQL_ROW row;
            while ((row = mysql_fetch_row(res)) != nullptr)
            {
                vec.push_back(atoi(row[0]));
            }

            mysql_free_result(res);
            return vec;
        }
    }
    return vec;
}